/*
 * Copyright (c) 2006-2023, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2018-08-24     yangjie      the first version
 */

/*
 * 程序清单：创建、初始化/脱离线程
 *
 * 这个例子会创建两个线程，一个动态线程，一个静态线程。
 * 静态线程在运行完毕后自动被系统脱离，动态线程一直打印计数到20。
 */
#include <aos/aos.h>
#include "aos/cli.h"
#include <debug/dbg.h>

#define THREAD_PRIORITY         25
#define THREAD_STACK_SIZE       2048
#define THREAD_TIMESLICE        5

static aos_task_t tid1 = NULL;
static aos_task_t tid2 = NULL;

/* 线程1的入口函数 */
static void thread1_entry(void *parameter)
{
    unsigned int count = 0;

    while (count < 10)
    {
        /* 线程1采用低优先级运行，一直打印计数值到20 */
        aos_debug_printf("thread1 count: %d\r\n", count ++);
        aos_msleep(500);
    }
    aos_debug_printf("thread1 exit\r\n");
}

/* 线程2的入口函数 */
static void thread2_entry(void *param)
{
    unsigned int count = 0;

    /* 线程2拥有较高的优先级，以抢占线程1而获得执行 */
    for (count = 0; count < 10 ; count++)
    {
        /* 线程2打印计数值 */
        aos_debug_printf("thread2 count: %d\r\n", count);
    }
    aos_debug_printf("thread2 exit\r\n");

    /* 线程2运行结束后也将自动被系统脱离 */
}

/* 线程示例 */
int yoc_thread_sample(int argc, char **argv)
{
    /* 创建线程1，名称是thread1，入口是thread1_entry*/
    aos_task_create(&tid1,
                    "thread1",
                    thread1_entry, NULL,
                    NULL,
                    THREAD_STACK_SIZE,
                    THREAD_PRIORITY, AOS_TASK_AUTORUN);

    /* 创建线程2，名称是thread2，入口是thread2_entry*/
    aos_task_create(&tid2,
                    "thread2",
                    thread2_entry, NULL,
                    NULL,
                    THREAD_STACK_SIZE,
                    THREAD_PRIORITY-1, AOS_TASK_AUTORUN);

    return 0;
}

/* 导出到 msh 命令列表中 */
ALIOS_CLI_CMD_REGISTER(yoc_thread_sample, yoc_thread_sample,yoc_thread_sample);
